/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.front.web.pay;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.thinkgem.jeesite.common.web.BaseController;
import com.thinkgem.jeesite.modules.config.entity.pay.ConfigPayManage;
import com.thinkgem.jeesite.modules.pay.entity.log.EcPayLog;
import com.thinkgem.jeesite.modules.pay.entity.upop.EcOrgUpop;
import com.thinkgem.jeesite.modules.pay.sdk.AcpService;
import com.thinkgem.jeesite.modules.pay.sdk.LogUtil;
import com.thinkgem.jeesite.modules.pay.sdk.SDKConfig;
import com.thinkgem.jeesite.modules.pay.service.log.EcPayLogService;
import com.thinkgem.jeesite.modules.pay.service.upop.EcOrgUpopService;
import com.thinkgem.jeesite.modules.pay.util.PayUtil;
import com.thinkgem.jeesite.modules.pay.util.UPOPUtil.UPOPInstall;

/**
 * 支付判断Controller（FRONT）
 * 
 * @author Egan
 * @version 2016-12-15
 */
@Controller
@RequestMapping(value = "${frontPath}/front/pay/check")
public class PayCheckController extends BaseController {
	
	@Autowired 
	EcPayLogService ecPayLogService;
	
	@Autowired 
	EcOrgUpopService ecOrgUpopService;
	
	@RequestMapping(value = "doCheck")
	@ResponseBody
	public Object doCheck(ConfigPayManage configPayManage, HttpServletRequest req, HttpServletResponse resp) {
		
		Map<String,Boolean> resultMap = new HashMap<String,Boolean>();
		String orderId = req.getParameter("orderId");
		String configPayId = req.getParameter("configPayId");
		EcOrgUpop upop = ecOrgUpopService.get(configPayId);
		
		EcPayLog log = new EcPayLog();
        log.setOrgCode(upop.getMerchantId());
        log.setMerChantid(upop.getMerchantId());
        log.setCoNum(orderId);
        EcPayLog ecPayLog = ecPayLogService.getEcPayLogByCoNumOrgCode(log);
        
        if (ecPayLog != null) {// 有支付日志
        	//1.支付成功 0,支付失败2，结果不确定
        	if ("1".equals(ecPayLog.getPayFlag())) {
        		resultMap.put("canPay", false);
        	} else if ("0".equals(ecPayLog.getPayFlag())) {
        		resultMap.put("canPay", true);
        	} else if ("2".equals(ecPayLog.getPayFlag())) {
        		log.setOrderNo(orderId);
        		log.setPayTime(ecPayLog.getPayTime());
        		Map<String, String> data = UPOPInstall.installParamsForCheck(log);
        		
        		/**请求参数设置完毕，以下对请求参数进行签名并发送http post请求，接收同步应答报文------------->**/
        		//报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
        		Map<String, String> reqData = AcpService.sign(data,PayUtil.encoding_UTF8);
        		// 交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl
        		String url = SDKConfig.getConfig().getSingleQueryUrl();
        		//这里调用signData之后，调用submitUrl之前不能对submitFromData中的键值对做任何修改，如果修改会导致验签不通过
        		Map<String, String> rspData = AcpService.post(reqData,url,PayUtil.encoding_UTF8);
        		
        		/**对应答码的处理，请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
        		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
        		if(!rspData.isEmpty()){
        			if(AcpService.validate(rspData, PayUtil.encoding_UTF8)){
        				LogUtil.writeLog("验证签名成功");
        				if("00".equals(rspData.get("respCode"))){//如果查询交易成功
        					//处理被查询交易的应答码逻辑
        					String origRespCode = rspData.get("origRespCode");
        					if("00".equals(origRespCode)){
        						//交易成功，更新商户订单状态
        						log.setPayFlag("1");
        						ecPayLogService.updatePayFlag(log);
        						resultMap.put("canPay", false);
        						//TODO
        					}else if("03".equals(origRespCode) ||
        							 "04".equals(origRespCode) ||
        							 "05".equals(origRespCode)){
        						//需再次发起交易状态查询交易 
        						//TODO
        						resultMap.put("canPay", false);
        					}else{
        						//其他应答码为失败请排查原因
        						resultMap.put("canPay", false);
        					}
        				}else{//查询交易本身失败，或者未查到原交易，检查查询交易报文要素
        					//TODO
        					resultMap.put("canPay", false);
        				}
        			}else{
        				LogUtil.writeErrorLog("验证签名失败");
        				resultMap.put("canPay", false);
        				//TODO 检查验证签名失败的原因
        			}
        		}else{
        			//未返回正确的http状态
        			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
        			resultMap.put("canPay", false);
        		}
        		String reqMessage = PayUtil.genHtmlResult(reqData);
        		String rspMessage = PayUtil.genHtmlResult(rspData);
        		try {
        			resp.getWriter().write("</br>请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
        		} catch (IOException e) {
        			// TODO Auto-generated catch block
        			e.printStackTrace();
        		}
        	}
        } else {// 没有支付日志，则从来没有支付过
        	resultMap.put("canPay", true);
        }
        
        return resultMap;
	}
}